﻿#include "StdAfx.h"
#include "image.h"

using namespace std;

//단순생성
image::image(void){
	//생성자
	this->src = NULL;
}

//SDL_Surface 를 이용하여 생성(font 출력 등에서 사용)
image::image(SDL_Surface * input_surface){
	this->load(input_surface);
}
//SDL_Surface 와 컬러키를 생성
image::image(SDL_Surface * input_surface,color * colorkey){
	this->load(input_surface, colorkey);
}
//SDL_Surface 와 컬러키와 스프라이트 지정
image::image(SDL_Surface * input_surface,color * colorkey, int sprite){
	this->load(input_surface, colorkey, sprite);
}
//파일 이름으로부터 생성
image::image(string filename){
	this->load(filename);
}
//파일이름과 컬러키를 생성
image::image(string filename,color * colorkey){
	this->load(filename,colorkey );
}
//파일이름과 컬러키와 스프라이트 지정
image::image(string filename,color * colorkey, int sprite){
	this->load(filename,colorkey,sprite);
}

//파일에서 이미지를 읽어옴
bool image::load_image(string filename)
{
	//로드한 이미지를 잠시 저장할 서피스
	SDL_Surface *loadedImage=NULL;
	
	//이미지 불러오기
	loadedImage = IMG_Load( filename.c_str());

	//이미지 로드가정상적으로 로드 되었다면
	if(loadedImage != NULL)	{
		// Create an optimized image
		this->src = SDL_DisplayFormat(loadedImage);
		// 필요 없는 이미지 해제
		SDL_FreeSurface(loadedImage);
	}
	else {//에러처리
		cout<<"이미지 읽어오기 실패!"<<":"<<"널 포인터 반환됨"<<endl;
		exit(0);
	}

	return true;
}

bool image::load(string filename){
	return this->load(filename, NULL);
}
bool image::load(string filename, color * colorkey){
	return this->load(filename, colorkey, 0);
}
bool image::load(string filename, color * colorkey, int sprite){
	this->load_image(filename);
	return this->load(this->src, colorkey, sprite);
}
bool image::load(SDL_Surface * input_surface){
	return this->load(input_surface, NULL);
}
bool image::load(SDL_Surface * input_surface, color * colorkey){
	return this->load(input_surface, colorkey, 0);
}
bool image::load(SDL_Surface * input_surface, color * in_color, int in_sprite){
	//에러처리
	if(input_surface == NULL){
		cout<<"이미지 읽어오기 실패!"<<":"<<"널 포인터 반환됨"<<endl;
		exit(0);
	}

	//영역 크기 반환
	SDL_GetClipRect(input_surface, &(this->size));

	//컬러키 설정
	if(in_color != NULL)
		this->colorkey(in_color);

	//스프라이트 설정
	if(in_sprite > 0){
		this->sprite_len = this->size.w / in_sprite;
		this->sprite = in_sprite;
	}
	else {
		this->sprite_len = this->size.w;
		this->sprite = 1;
	}

	//표시 영역 지정
	this->offset = size;
	this->offset.w = this->sprite_len;

	//초기위치 지정
	this->xy = size;

	return true;
}


int image::colorkey(color * in_color)
{
	Uint32 colorkey = SDL_MapRGB(this->src->format, in_color->r, in_color->g, in_color->b);
	return SDL_SetColorKey(this->src, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey);
}
image::~image(void)
{
	if(this->src != NULL)
		SDL_FreeSurface(this->src);
}
void image::set_xy(int in_x, int in_y)
{
	this->xy.x = in_x;
	this->xy.y = in_y;
}